Git de commit geschiedenis inspecteren
git log
.Wat hieraan voorafgaat
Je hebt Git bestanden neerleggen doorlopen.
Bron
Inleiding
Nadat je de bestanden hebt neergelegd en voer je git log
uit. Zonder argumenten toont de instructie git log
de commits, die in de repository staan, in omgekeerde chronologische volgorde. Dat wil zeggen, de meest recente commits staan eerst. Zoals je kan zien, toont dit commando iedere commit met zijn SHA-1 checksum, de auteursnaam en e-mail (als die is opgegeven, zie daarvoor Git configuren, ik heb die nog niet opgegeven), de datum en boodschap van de commit.
krijg je hetvolgde te zien:
Er zijn massa's opties beschikbaar voor het git log
commando om je precies te laten zien wat je zoekt. Hier bespreek ik een aantal van de meest populaire opties.
Een van de meest nuttige opties is -p
, waarbij je het verschil in elke commit kan visualisern. Je kan ook gebruik maken van -2
, die de output beperkt tot alleen de laatste twee items. Om de log te verlaten typ je q
. Je typt z
om naar het einde van de log te springen.
Deze optie toont dezelfde informatie, maar met een diff direct na elke vermelding. Dit is erg handig voor een code review of om snel te bladeren door een serie commits die een medewerker heeft toegevoegd.
Je kan ook gebruik maken van een serie samenvattende opties met git log
. Bijvoorbeeld, als je overzichtelijke statistieken wilt zien voor iedere commit, dan maak je gebruik van de --stat
optie:
De --stat
optie toont onder iedere commit een lijst van gewijzigde bestanden, hoeveel bestanden werden veranderd, en hoeveel regels in die bestanden zijn toegevoegd en verwijderd. Aan het eind toont het een samenvatting van de informatie.
Een andere handige optie is --pretty
. Deze optie verandert de log output naar een opgegeven format. De oneline
optie drukt iedere commit op een enkele regel. Dat is handig als door een hele hoop commits moet bladeren. De opties, [short], [full], en [fuller], kan in ongeveer hetzelfde formaat, maar met minder of meer informatie, opgeven:
Een interessante optie is format
, waarmee je je eigen log output formaat kan opgeven. Dit kan handig zijn als je output voor machine parsing wil genereren:
Table 1. Opties voor git log --pretty=format |
|
Optie | Beschrijving van de output |
%H | Commit hash |
%h | Abbreviated commit hash |
%T | Tree hash |
%t | Abbreviated tree hash |
%P | Parent hashes |
%p | Abbreviated parent hashes |
%an | Author name |
%ae | Author e-mail |
%ad | Author date (format respects the –date= option) |
%ar | Author date, relative |
%cn | Committer name |
%ce | Committer email |
%cd | Committer date |
%cr | Committer date, relative |
%s | Subject |
Je kunt je afvragen wat het verschil is tussen de auteur en de committer. De auteur is de persoon die het werk oorspronkelijk schreef, terwijl de committer de persoon is die het laatst het werk neergelegd heeft. Dus, als je een patch naar een project instuurt en één van de kernleden de repo legt die neer, kan krijgen jullie beiden, jij als auteur, en het kernlid als de committer. We zullen dit onderscheid verder bespreken als we het hebben over gedistribueerde Git.
De oneline
en het format
opties zijn vooral nuttig in combinatie met een andere log optie genaamd --graph
. Deze optie maakt een mooie ASCII grafiek waarin de branch en merge geschiedenis wordt gevisualiseerd:
git log --pretty=format:"%h %s" --graph
Dat zijn slechts enkele eenvoudige output-format opties voor log git
. Er zijn er nog veel meer. Hier volgt een lijst van de meest courante:
Option | Description |
---|---|
-p |
Show the patch introduced with each commit. |
--stat |
Show statistics for files modified in each commit. |
--shortstat |
Display only the changed/insertions/deletions line from the --stat command. |
--name-only |
Show the list of files modified after the commit information. |
--name-status |
Show the list of files affected with added/modified/deleted information as well. |
--abbrev-commit |
Show only the first few characters of the SHA-1 checksum instead of all 40. |
--relative-date |
Display the date in a relative format (for example, “2 weeks ago”) instead of using the full date format. |
--graph |
Display an ASCII graph of the branch and merge history beside the log output. |
--pretty |
Show commits in an alternate format. Options include oneline, short, full, fuller, and format (where you specify your own format). |
De Log Output beperken
In aanvulling op output-format opties, beschikt git log
ook over een aantal limiterende opties. Dat wil zeggen, opties waarmee je de output kan beperken tot een subset van de commits. Je hebt een dergelijke optie al gezien - de -2
optie, die slechts de laatste twee commits laat zien. De -<n>
optie, waarbij n
een geheel getal, ge je waarschijnlijk niet vaak gebruiken, omdat Git standaard alle output door een pager laat lopen zodat je slechts één pagina log-output tegelijk ziet.
De in de tijd beperkende opties zoals --since
en --until
zijn zeer nuttig. Bijvoorbeeld, deze opdracht toon de lijst van commits in de afgelopen twee weken:
$ Git log --since=2.weeks
Dit commando werkt met veel formats - je kan een specifieke datum zoals "2008-01-15", of een relatieve datum opgeven, zoals "2 jaar 1 dag 3 minuten geleden".
Je kan de lijst van commits filteren op overeenkomen met een aantal zoekcriteria. Met de --author
optie kan je filteren op een specifieke auteur, en met de --grep
optie kan jezoeken naar trefwoorden in de commit berichten. Als je de --author en --grep opties opgeeft, moet je --all-match
toe voegen.
Een andere filter is de -S
optie die een string aanneemt en alleen de commits toont die een wijziging in de code, die toegevoegd of verwijderd die string introduceerde, toont. Bijvoorbeeld, als je op zoek bent naar de laatste commit die een verwijzing naar een specifieke functie toevoegde of verwijderde, voer je het volgende commando uit:
$ git log -Sfunction_name
Je kan aan git log ook filter opgeven die een pad bevat. Als je een map of bestandsnaam opgeeft, kan je de log output beperken tot commits die een verandering introduceerden met betrekking tot de opgegeven bestanden en paden. Dit is altijd de laatste optie in de rij en wordt gewoonlijk voorafgegaan door dubbele streepjes (-) om de paden te scheiden van de opties.
Option | Description |
---|---|
-(n) |
Show only the last n commits |
--since , --after |
Limit the commits to those made after the specified date. |
--until , --before |
Limit the commits to those made before the specified date. |
--author |
Only show commits in which the author entry matches the specified string. |
--committer |
Only show commits in which the committer entry matches the specified string. |
--grep |
Only show commits with a commit message containing the string |
-S |
Only show commits adding or removing code matching the string |
Bijvoorbeeld, als je wil zien welk testbestanden in de Git broncode geschiedenis zijn veranderd in de maand oktober 2016 neergelegd door Jef Inghelbrecht en er waren geen samenvoegingen, kun je zoiets als dit uitvoeren:
git log --pretty="%h - %s" --author=Jef Inghelbrecht --since="2017-10-01" \ --before="2016-11-01" --no-merges -- t/